//
//
//

#include "dlist.h"
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <stdio.h>

// callback capital
static int capital_cb(dlist dl, void *context);

// call back debug
static void print_char(void *value);

// testing functions
void add_string(dlist dl);
void remove_string(dlist dl);

//
int main(void)
{
    dlist d_list;
    d_list = dl_create();
    //    dl_print(d_list, print_char);

    dlist p = d_list;
    /*
    char *s1 = "hello world\n";
    dl_add_after(p, s1);
    */
    add_string(d_list);
    add_string(d_list);
    add_string(d_list);
    dl_print(dl_next(p), print_char);

    // capital it
    dl_foreach(d_list, capital_cb, NULL);
    dl_print(dl_next(p), print_char);

    remove_string(d_list);
    remove_string(d_list);
    remove_string(d_list);

    dl_destroy(d_list);
    return 1;
}

//
//
//
void
add_string(dlist dl)
{
    char *s21 = strdup("hello world");
    dl_add_after(dl, (void *)s21);
}

//
//
//
void
remove_string(dlist dl)
{
    char *s = NULL;
    s = (char *)dl_remove_after(dl);
    if (s != NULL) {
      //        printf("S != null %X\n", s);
	free(s);
	s = NULL;
    }
}

//
//
//
int
capital_cb(dlist dl, void *context)
{
    printf("capital_cb() start\n");
    // unimplemented

    context = context;
    char *c = NULL;

    c = (char *)dl_get_value(dl);
    do {
	if ( c == NULL )
	    return 0;

	if ( *c == '\0' )
	    break;

        if ( *c != '\0' && islower( *c ) ) {
	    *c = toupper(*c);
	    //	    printf("%c ", *c);
	}
	c++;
    } while(1);

    return 1;
}

//
//
//
void
print_char(void *value)
{
    while ( *((char *)value) != '\0' ) {
        printf("%c ", *((char *)value));
	value++;
    }
    printf("\n");
}
